#!/usr/bin/env bash
#<SHELL STANDARD>
#------------HEADER-----------------------------------------------------------|
#AUTOR
#  Jefferson Rocha <lrcjefferson@gmail.com>
#
#PROGRAMA
#  Lisa
#
#VERSÃO
#  1.0
#
#LICENÇA
#  MIT
#
#DESCRIÇÃO
#  Lisa é um sistema de backup que utiliza o rsync como principal forma de
#  backup e sincronismo 'Origem/Destino'.
#  Criada especialmente para fazer backups 'localmente' em dispositivos
#  removiveis ou não, Pendrives, HD, HD Externo.
#
#NOTA
#  A Lisa não utiliza os nomes de dispositivos, exemplo (/dev/sdb) (/dev/sdc)
#  ao invés disto é utilizado o UUID do dispositivo.
#  Com a informação do UUID do dispositivo fica menos sucessivel a falhas
#  existem vários problemas relacionados principalmente com HD's Externo,
#  as vezes montamos como /dev/sdb por exemplo, e ao desmontar é trocado para
#  /dev/sdc, com isto é gerado uma falha no backup, prefira indiciar o UUID.
#  
#  Para conseguir o UUID do dispositivo rode o comando 'lsblk -l' para 
#  saber qual é o seu dispositivo. Em seguida rode o comando
#  'blkid', para conseguir o UUID.
#  Copie o UUID do dispositivo e adicione em /etc/fstab
#  o ponto de montagem, exemplo de um HD externo em fstab:
#
#  UUID=d4569c6f-2750-4128-a049-f225985aa812 /media/hd_externo ext4 auto 0 0
#
#  Salve, desmonte todos dispositivos do fstab em seguida monte novamente:
#  umount -a
#  mount -a 
#
#CHANGELOG:
#
#-----------------------------------------------------------------------------|



#------VARS--------------------------------------#

# ADICIONE A UUID DO SEU DISPOSITIVO AQUI!
# Rode o comando 'lsblk -l' para identificar qual
# o seu dispositivo em seguida rode 'blkid' e
# pegue a UUID referente e adicione nesta
# váriavel!
UUID="d4569c6f-2750-4128-a049-f225985aa812" 

dispositivo_base="$(blkid -U $UUID)"             # NÃO MEXER
diretorio_de_montagem="/mnt/backup-lisa"         # Qual diretorio será montado o Dispositivo?
diretorio_para_envio="/home/slackjeff"           # Qual diretorio enviar?
log="/tmp/backup-lisa.log"                       # Especifique qual diretorio de login


# Ative as opções que desejar, estas opções
# podem ser ativas em linha caso você não
# queira ficar mexendo no fonte do programa.
verbose=""     ; [[ "${VERBOSE:-sim}" = "sim" ]]       && verbose="--verbose"         # Modo Verboso
update=""      ; [[ "${UPDATE:-sim}" = "sim" ]]        && update="--update"           # Pula arquivos se são iguais c/data posterior origem/destino
delete=""      ; [[ "${DELETE:-sim}" = "sim" ]]        && delete="--delete"           # Não tem na origem? destino é excluido tambem!
human=""       ; [[ "${HUMAN:-sim}" = "sim" ]]         && human="--human-readable"    # Leitura para humanos Kbytes,Mega, Giga etc...
archive=""     ; [[ "${ARCHIVE:-sim}" = "sim" ]]       && archive="--archive"         # Modo de arquivamento, Copias de forma recursiva com preservação
recursive=""   ; [[ "${RECURSIVE:-nao}" = "sim" ]]     && recursive="--recursive"     # Cópia de forma recursiva, não preserva timestamp, permissão
compress=""    ; [[ "${COMPRESS:-sim}" = "sim" ]]      && compress="--compress"       # Compressão no envio, arquivos mais leves.
progress=""    ; [[ "${PROGRESS:-sim}" = "sim" ]]      && progress="--progress"       # Ativar progresso no envio
linksymbols="" ; [[ "${LINKSYMBOLS:-nao}" = "sim" ]]   && linksymbols="--safe-links"  # Ignorar Links Symbolicos do envio
perms=""       ; [[ "${PERMS:-nao}" = "sim" ]]         && perms="--perms"             # Preservar Permissões dos arquivos/diretorios
quiet=""       ; [[ "${QUIET:-nao}" = "sim" ]]         && quiet="--quiet"             # Modo silencioso

# Vamos fazer algumas verificações
# para não dar conflito!

#--------------------------------------------#
# Verificando se DELETE/UPDATE está ativo.
# Se caso o update está ativo e a opção
# delete for ativada, não dará muito certo
#--------------------------------------------#
[[ "$delete" = "--delete" ]] && update="" # Desabilitando update
[[ "$update" = "--update" ]] && delete="" # Desabilitando delete
#--------------------------------------------#
# Verificando se VERBOSE/QUIET está ativo.
# Se caso a verbose está ativa e a opção
# quiet for ativada, não dará muito certo,
# precisamos desabilitar algum, para não
# entrar em conflieto.
#--------------------------------------------#
[[ "$verbose" = "--verbose" ]] && quiet="" # Desabilitando quiet
[[ "$quiet" = "--quiet" ]] && verbose=""   # Desabilitando verbose



#-------------------------------------------------#
# Caso deseje Excluir Diretorios ou arquivos
# que NÃO são necessários, como diretorios
# de caches e arquivs etc... da sua sincronização
# desmarque os exclude necessáros e adicione
# o diretorio ou arquivo...
# Há um padrão a seguir, siga o padrão para não
# ter erros, template de exemplo:
# exclude0="--exclude="*.mp3""
#-------------------------------------------------#
exclude1="--exclude=".*""
exclude2="--exclude="Downloads""
exclude3="--exclude="Desktop/ZeroBundle""
#exclude4=""
#exclude5=""
#exclude6=""
#exclude7=""
#exclude8=""
#exclude9=""
#exclude10=""

#--------------FIM VAR------------------------------#




#--------------TESTES---------------------------#
[[ $(id -u) -ne "0" ]] && exit 1 # É Root?
[[ $(which rsync) ]] || { echo "Necessita do rsync..." ; exit 1 ;} # Rsync ta no sistema?

#------------------------------#
# Montando dispositivo,
# vamos fazer 10 tentativas...
#------------------------------#
if ! df -h | grep -o "$dispositivo_base"; then
    dispositivo="off" # Iniciando váriavel
    contadora="1"     # Iniciando váriavel com 1
    while [[ "$dispositivo" = "off" ]]; do
        if mount "$dispositivo_base" "$diretorio_de_montagem"; then
            dispositivo="on"
            
        else
            echo "###################################oooooooooooooi"
        fi
        [[ "$contadora" -eq "10" ]] && exit 1 || let contadora++
    done
fi


#-------------FIM TESTES-------------------------------#



set -e  # Deu erro parou.
inicio="$(date +%H:%M:%S--%d/%m/%Y)"    # Pegando Hora de Inicio

if  rsync \
  "$verbose" \
  "$update" \
  "$delete" \
  "$human" \
  "$archive" \
  "$recursive" \
  "$compress" \
  "$progress" \
  "$linksymbols" \
  "$perms" \
  "$quiet" \
  "$exclude1" \
  "$exclude2" \
  "$exclude3" \
  "$exclude4" \
  "$exclude5" \
  "$exclude6" \
  "$exclude7" \
  "$exclude8" \
  "$exclude9" \
  "$exclude10" \
  "$diretorio_para_envio" \
  "$diretorio_de_montagem"; then
    # Enviando Log caso o rsync NÃO falhe
    fim="$(date +%H:%M:%S--%d/%m/%Y)"   # Pegando Hora de Fim
    echo "" >> "$log"
    echo "#-------------------------------------------#" >> "$log"
    echo -e "Iniciado em: $inicio \nFinalizado em: $fim" >> "$log"
    echo ">>BACKUP REALIZADO COM SUCESSO." >> "$log"
    echo "Gravado em $dispositivo_base" >> "$log"
    echo "#-------------------------------------------#" >> "$log"

fi
   
